#include "PointOfView.h"
#include <stdio.h>
PointOfView::PointOfView()
{
    mode=freePow;

    lockX=0;
    lockY=0;
    lockZ=0;

    rayon=5;

    phi=0;
    teta=0;

    positionPOW=new Vectorf(0,0,0);
    vecteurDirecteur=Vectorf(0.0,0.0,0.0);
    SetVecteurDirecteur();
}


void PointOfView::SetVecteurDirecteur()
{
    vecteurDirecteur.x(-cos(teta*3.14/180)*sin(phi*3.14/180));
    vecteurDirecteur.y(sin(teta*3.14/180));
    vecteurDirecteur.z(cos(teta*3.14/180)*cos(phi*3.14/180));
    vecteurDirecteur=vecteurDirecteur.Normalize();
    vecteurDirecteur=vecteurDirecteur.Inverse();
}

void PointOfView::SetPOW()
{
    switch(mode)
    {
        case freePow :

        glRotatef(teta,1, 0, 0);
        glRotatef(phi, 0, 1, 0);

        glTranslatef(-positionPOW->x(),-positionPOW->y(),-positionPOW->z());

        break;

        case lockPow :

        glTranslatef(0,0,-rayon);
        glRotatef(teta,1, 0, 0) ;
        glRotatef(phi, 0, 1, 0);
        glTranslatef(-positionPOW->x(),-positionPOW->y(),-positionPOW->z());

        break;
    }
}

void PointOfView::SetFree(float ateta, float aphi, Vectorf apos)
{
    teta=ateta;
    phi=aphi;
    positionPOW= new Vectorf(apos.x(), apos.y(), apos.z());

    mode=freePow;

}
void PointOfView::SetLock(float arayon, Vectorf apos)
{
    rayon=arayon;
    positionPOW= new Vectorf(apos.x(), apos.y(), apos.z());

    mode=lockPow;
}

void PointOfView::SetLock(float arayon, Vectorf apos, float aphi, float ateta)
{
    rayon= arayon;
    teta=ateta;
    phi=aphi;
    positionPOW= new Vectorf(apos.x(), apos.y(), apos.z());

    mode=lockPow;
}

void PointOfView::GoForward(float coef)
{
    switch(mode)
    {
        case freePow :
        if(!lockX)
        {
            positionPOW->x(positionPOW->x()+vecteurDirecteur.x()*coef);
        }
        if(!lockY)
        {
             positionPOW->y(positionPOW->y()+vecteurDirecteur.y()*coef);
        }
        if(!lockZ)
        {
             positionPOW->z(positionPOW->z()+vecteurDirecteur.z()*coef);
        }
        break;

        case lockPow :

        rayon-=coef;

        break;
    }
}

void PointOfView::GoLeft(float coef)
{

    switch(mode)
    {
        case freePow :


        break;


    }


}

void PointOfView::GoRight(float coef)
{
    switch(mode)
    {
        case freePow :

        positionPOW->x(positionPOW->x()-vecteurDirecteur.x()*coef);
        positionPOW->y(positionPOW->y()-vecteurDirecteur.y()*coef);
        positionPOW->z(positionPOW->z()-vecteurDirecteur.z()*coef);

        break;
    }

}

void PointOfView::GoDownward(float coef)
{
    switch(mode)
    {
        case freePow :

        positionPOW->x(positionPOW->x()-vecteurDirecteur.x()*coef);
        positionPOW->y(positionPOW->y()-vecteurDirecteur.y()*coef);
        positionPOW->z(positionPOW->z()-vecteurDirecteur.z()*coef);

        break;

        case lockPow :

        rayon+=0.1;

        break;
    }
}
